package com.fuze.energy.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author sepc_
 * @date 3/16/2021 13:53
 * 统一的返回结果
 */
@ApiModel(value = "Result")
@ToString
public class Result implements Serializable {

    private static final long serialVersionUID = -6956586964810016807L;

    /**
     * 返回的状态码
     */
    @Getter
    @ApiModelProperty(value = "状态码", example = "200",required = true)
    private Integer code;

    /**
     * 返回的信息
     */
    @Getter
    @ApiModelProperty(value = "提示信息",example = "OK", required = true)
    private String message;

    /**
     * 返回的数据
     */
    @Getter
    @ApiModelProperty(value = "数据")
    private Object data;

    private Result() {
    }

    private Result(Advice advice) {
        this.code = advice.getCode();
        this.message = advice.getMessage();
    }

    private Result(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    private Result(Advice advice, Object data) {
        this.code = advice.getCode();
        this.message = advice.getMessage();
        this.data = data;
    }

    /**
     * 不携带数据的统一返回
     *
     * @return 统一返回
     */
    public static Result ok() {
        return new Result(Advice.SUCCESS);
    }

    /**
     * 携带数据的成功的返回
     *
     * @param data 携带的数据
     * @return 统一返回
     */
    public static Result ok(Object data) {
        return new Result(Advice.SUCCESS, data);
    }


    /**
     * 所有的返回错误必须在枚举类型里面先声明
     * 统一返回异常结果
     */
    public static Result err(Advice advice) {
        return new Result(advice);
    }

     /*
    请求在程序里面失败我们不需要数据返回！
     */

    /**
     * 这里可见性声明为 protected 的目的是为了让这个方法只在全局异常处理的时候方便统一处理返回值，其他的时候我们应该统一使用枚举
     *
     * @param code    错误码
     * @param message 错误信息
     * @return 统一返回值
     */
    protected static Result err(Integer code, String message) {
        return new Result(code, message);
    }


}